import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path

# 设置中文字体（兼容Windows系统）
plt.rcParams["font.family"] = ["SimHei", "Microsoft YaHei", "SimSun"]
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题

def generate_visualization(data_path, result_path, output_image):
    # 读取原始数据和分析结果
    df_data = pd.read_excel(data_path, sheet_name='Sheet1')
    df_result = pd.read_excel(result_path)
    
    # 提取分析结果
    takeoff_frame = int(df_result.iloc[0]['起跳帧'])
    landing_frame = int(df_result.iloc[0]['落地帧'])
    flight_time = round(df_result.iloc[0]['滞空时间(秒)'], 2)
    ground_median = round(df_result.iloc[0]['地面基准(像素)'], 2)
    landing_threshold = ground_median + 3  # 落地阈值
    
    # 数据处理
    df_data['h_foot_smooth'] = df_data[['29_Y', '30_Y']].min(axis=1).ewm(span=5).mean()
    df_data['y_com'] = (df_data['11_Y'] + df_data['5_Y']).ewm(span=5).mean() / 2  # 质心高度
    delta_t = 1/30
    df_data['v_y'] = df_data['y_com'].diff() / delta_t  # 质心速度
    df_data['a_y'] = df_data['v_y'].diff() / delta_t    # 质心加速度
    
    # 创建画布和子图
    fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(16, 18), sharex=True)
    fig.subplots_adjust(hspace=0.3)
    
    # 子图1: 脚部高度变化
    ax1.plot(df_data['帧号'], df_data['h_foot_smooth'], 'b-', linewidth=2, label='脚部高度(平滑)')
    ax1.plot(df_data['帧号'], df_data[['29_Y', '30_Y']].min(axis=1), 'lightblue', linewidth=1.5, label='脚部高度(原始)')
    ax1.axhline(y=ground_median, color='g', linewidth=2, label=f'地面基准: {ground_median:.2f}')
    ax1.axhline(y=landing_threshold, color='orange', linestyle='--', linewidth=2, label=f'落地阈值: {landing_threshold:.2f}')
    ax1.axvline(x=takeoff_frame, color='r', linewidth=2.5, label=f'起跳帧: {takeoff_frame}')
    ax1.axvline(x=landing_frame, color='purple', linewidth=2.5, label=f'落地帧: {landing_frame}')
    
    # 标记腾空阶段
    ax1.axvspan(takeoff_frame, landing_frame, color='lightblue', alpha=0.2, label=f'腾空阶段 ({int(flight_time*30)}帧)')
    ax1.scatter(takeoff_frame, df_data.loc[df_data['帧号']==takeoff_frame, 'h_foot_smooth'], color='r', s=100, zorder=5)
    ax1.scatter(landing_frame, df_data.loc[df_data['帧号']==landing_frame, 'h_foot_smooth'], color='purple', s=100, zorder=5)
    
    ax1.set_title(f'跳远脚部高度变化 (滞空时间: {flight_time:.2f}秒)', fontsize=14, fontweight='bold')
    ax1.set_ylabel('高度 (像素)', fontsize=12)
    ax1.legend(loc='upper left')
    ax1.grid(alpha=0.3)
    
    # 子图2: 质心速度与加速度变化
    ax2.plot(df_data['帧号'], df_data['v_y'], 'orange', linewidth=2, label='质心垂直速度')
    ax2.plot(df_data['帧号'], df_data['a_y'], 'm--', linewidth=2, label='质心垂直加速度')
    ax2.axhline(y=0, color='k', linewidth=1.5, alpha=0.5)
    ax2.axvline(x=takeoff_frame, color='r', linewidth=2.5)
    ax2.axvline(x=landing_frame, color='purple', linewidth=2.5)
    
    ax2.set_title('质心速度与加速度变化 (落地时速度<0，加速度突变)', fontsize=14, fontweight='bold')
    ax2.set_ylabel('速度/加速度 (像素/秒²)', fontsize=12)
    ax2.legend(loc='upper left')
    ax2.grid(alpha=0.3)
    
    # 子图3: 髋关节与手腕高度变化
    ax3.plot(df_data['帧号'], df_data['11_Y'], 'g-', linewidth=2, label='髋关节(11_Y)')
    ax3.plot(df_data['帧号'], df_data['15_Y'], 'r-', linewidth=2, label='左手腕')
    ax3.plot(df_data['帧号'], df_data['17_Y'], 'orange', linewidth=2, label='右手腕')
    ax3.axvline(x=takeoff_frame, color='r', linewidth=2.5)
    ax3.axvline(x=landing_frame, color='purple', linewidth=2.5)
    
    ax3.set_title('髋关节与手腕高度变化 (异常落地检测参考)', fontsize=14, fontweight='bold')
    ax3.set_xlabel('帧号', fontsize=12)
    ax3.set_ylabel('高度 (像素)', fontsize=12)
    ax3.legend(loc='upper left')
    ax3.grid(alpha=0.3)
    
    # 保存图片
    plt.savefig(output_image, dpi=300, bbox_inches='tight')
    plt.close()
    
    return output_image

if __name__ == "__main__":
    # 确保路径中的文件夹名称是简单中文（如“跳远数据”），避免乱码
    data_path = Path(r'C:\Users\lianxiang\Desktop\E题\附件\附件5\运动者11的跳远位置信息.xlsx')
    result_path = Path(r'C:\Users\lianxiang\Desktop\E题\附件\附件5\运动者11跳远最终分析结果.xlsx')
    # 使用简单文件名，避免复杂字符导致显示乱码
    output_image = r'C:\Users\lianxiang\Desktop\E题\附件\附件5\运动者11跳远可视化.png'
    
    if data_path.exists() and result_path.exists():
        generate_visualization(data_path, result_path, output_image)
        # 打印时使用中文逗号和简单描述，减少编码问题
        print("可视化图片已生成：", output_image)
    else:
        if not data_path.exists():
            print("原始数据文件不存在：", data_path)
        if not result_path.exists():
            print("分析结果文件不存在：", result_path)
